From dcfb6e5ef5577ee6a1bca56e356a91c88d9e8f9c Mon Sep 17 00:00:00 2001 From: Matthias Clasen Date: Tue, 3 Nov 2020 15:28:40 -0500 Subject: [PATCH] surface: Be smarter about autohide When we close grabbing popups due to an outside click, check at each level if the click is still outside. This makes closing the nested popover menu in the popover on page 3 of widget-factory work as expected, when you click the menubutton again. --- gdk/gdksurface.c | 26 ++++++++++++-------------- 1 file changed, 12 insertions(+), 14 deletions(-) diff --git a/gdk/gdksurface.c b/gdk/gdksurface.c index 00990ea40e..6d8e92aec3 100644 --- a/gdk/gdksurface.c +++ b/gdk/gdksurface.c @@ -2657,18 +2657,6 @@ gdk_synthesize_surface_state (GdkSurface *surface, gdk_surface_set_state (surface, (surface->state | set_flags) & ~unset_flags); } -static void -hide_popup_chain (GdkSurface *surface) -{ - GdkSurface *parent; - - gdk_surface_hide (surface); - - parent = surface->parent; - if (parent->autohide) - hide_popup_chain (parent); -} - static gboolean check_autohide (GdkEvent *event) { @@ -2695,13 +2683,23 @@ check_autohide (GdkEvent *event) device = gdk_event_get_device (event); if (gdk_device_grab_info (display, device, &grab_surface, NULL)) { - GdkSurface *event_surface = gdk_event_get_surface (event); + GdkSurface *event_surface; + + event_surface = gdk_event_get_surface (event); if (grab_surface != event_surface && grab_surface != event_surface->parent && grab_surface->autohide) { - hide_popup_chain (grab_surface); + GdkSurface *surface = grab_surface; + + do + { + gdk_surface_hide (surface); + surface = surface->parent; + } + while (surface->autohide && surface != event_surface); + return TRUE; } } -- 2.30.2